﻿using System;
using web_uchet.Models;
using System.Linq;
using System.Data.Objects;
using System.Collections.Generic;
using Mvc.Validation;
using Mvc.Validation.Validators;
using web_uchet.Security.Enums;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using web_uchet.Security;
namespace web_uchet.ViewModels
{
    interface IViewМесто_Работы
    {
        string Доп_Информация { get; set; }
        int ИД_Места_Работы { get; }
        Компания Компания { get; set; }
        int ИД_Компании { get; set; }
        System.Data.Objects.DataClasses.EntityReference<Компания> КомпанияReference { get; set; }
        string Название { get; set; }
        System.Data.Objects.DataClasses.EntityCollection<Пользователь> Пользователи { get; set; }
    }
    [System.Web.Mvc.Bind(Exclude = "ИД_Места_Работы,ИД_Компании")]
    public class ViewМесто_Работы : IViewМесто_Работы
    {
        private Место_Работы _Место_Работы;
        public Место_Работы Место_Работы { get { return this._Место_Работы; } }
        public ViewМесто_Работы()
        {
            this._Место_Работы = new Место_Работы();
            this.КомпанияReference.EntityKey = new System.Data.EntityKey("ModelWebUchetCon.Компании", "ИД_Компании", 0);
        }
        public ViewМесто_Работы(Место_Работы Base)
        {
            this._Место_Работы = Base;
        }
        #region IViewМесто_Работы Members
        [StringLengthValidator(45, MessageTemplate = "Не более 45 символов")]
        public string Доп_Информация
        {
            get
            {
                return this._Место_Работы.Доп_Информация;
            }
            set
            {
                if (value == null) this._Место_Работы.Доп_Информация = string.Empty;
                else
                    this._Место_Работы.Доп_Информация = value;
                
            }
        }

        public int ИД_Места_Работы
        {
            get { return this._Место_Работы.ИД_Места_Работы; }
        }

        public Компания Компания
        {
            get
            {
                return this._Место_Работы.Компания;
            }
            set
            {
                this._Место_Работы.Компания = value;
            }
        }
        public int ИД_Компании
        {
            get { return Convert.ToInt32(this.КомпанияReference.EntityKey.EntityKeyValues.First(e => e.Key == "ИД_Компании").Value); }
            set { this.КомпанияReference.EntityKey = new System.Data.EntityKey("ModelWebUchetCon.Компании", "ИД_Компании", value); }
        }

        public System.Data.Objects.DataClasses.EntityReference<Компания> КомпанияReference
        {
            get
            {
                return this._Место_Работы.КомпанияReference;
            }
            set
            {
                this._Место_Работы.КомпанияReference = value;
            }
        }
        [NotNullOrEmptyValidator(MessageTemplate="Введите название рабочего места")]
        [StringLengthValidator(45, MessageTemplate = "Не более 45 символов")]
        public string Название
        {
            get
            {
                return this._Место_Работы.Название;
            }
            set
            {
                if (value == null) this._Место_Работы.Название = string.Empty;
                else
                this._Место_Работы.Название = value;
            }
        }

        public System.Data.Objects.DataClasses.EntityCollection<Пользователь> Пользователи
        {
            get
            {
                return this._Место_Работы.Пользователи;
            }
            set
            {
                this._Место_Работы.Пользователи = value;
            }
        }

        #endregion
    }

    public class ViewМесто_РаботыOperationProvider
    {
        private ModelWebUchetCon _Context;

        public ViewМесто_РаботыOperationProvider()
        {
            this._Context = new ModelWebUchetCon(ModelWebUchetCon.SingleToneConnection);
        }
        public ViewМесто_РаботыOperationProvider(ModelWebUchetCon Context)
        {
            this._Context = Context;
        }

        //v CompanyID - ID компании для которой делаем LIST
        public IEnumerable<ViewМесто_Работы> List(int CompanyID)
        {
            return this._Context.Места_Работы.Where(e => e.Компания.ИД_Компании == CompanyID).ToList()
                .Select(e => new ViewМесто_Работы(e));
        }
        public ViewМесто_Работы Details(int WorkPlaceID, ProgramContext SecurirtyData)
        {
            ViewМесто_Работы NeededWorkPlace =
                new ViewМесто_Работы(this._Context.Места_Работы.First(e => e.ИД_Места_Работы == WorkPlaceID));
            if (Convert.ToInt32(
                NeededWorkPlace.КомпанияReference.EntityKey.EntityKeyValues.First(e => e.Key == "ИД_Компании").Value) == SecurirtyData.CompanyID)
                return NeededWorkPlace;
            else throw new System.Security.SecurityException("Попытка получить данные чужой компании");
        }
        //Disable User
        public void Delete(int WorkPlaceID, ProgramContext SecurirtyData)
        {
            Место_Работы ObjectToDelete = this.Details(WorkPlaceID, SecurirtyData).Место_Работы;
            Место_Работы NoWorkPlace = this._Context.Места_Работы.First(e => e.Компания.ИД_Компании == SecurirtyData.CompanyID &&
                e.Название == "Нет");
            foreach (Пользователь P in
            this._Context.Пользователи.Where(e => e.Место_Работы.ИД_Места_Работы == WorkPlaceID))
                P.Место_Работы = NoWorkPlace;
            
            this._Context.DeleteObject(ObjectToDelete);
            this.SaveChanges();
        }

        public void Create(ViewМесто_Работы NewViewМесто_Работы, ProgramContext SecurirtyData)
        {
            NewViewМесто_Работы.ИД_Компании = SecurirtyData.CompanyID;
            this._Context.AddToМеста_Работы(NewViewМесто_Работы.Место_Работы);
            this.SaveChanges();
        }
        public void SaveChanges()
        {
            this._Context.SaveChanges(true);
        }
    }
}
